package tianfeng.SecurityDemo.service;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author tianfeng
 * @email tianfeng77133@163.com
 * @date 2021/4/5
 */
@Service("userDetailsService")
public class MyUserDetailService implements UserDetailsService {


    /**
     *  实现这个接口之后默认覆写的方法
     *  在这个接口中可以获取到表单页中的用户名字段
     *  通过对用户的校验，用户存在返回对应的 UserDetails 对象
     *  如果不存在，抛出异常
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // username 是表单页中输入的内容
        if(!"cc".equals(username)) {
            throw new UsernameNotFoundException("查无此人！");
        }
        // 通过这个方法可以配置权限和角色两种内容，对于security而言，权限和角色都是一样的，都是authentic
        // 需要注意的是，如果是配置角色，需要在角色前添加“ROLE_”的前缀，
        // 因为解析role的时候系统会自动添加这个前缀，用于区分角色和权限
        List<GrantedAuthority> auth = AuthorityUtils.commaSeparatedStringToAuthorityList("ROLE_role");
        return new User("cc",new BCryptPasswordEncoder().encode("123"),auth);
    }
}
